#include "GameModel.h"
#include <time.h>
#include <stdlib.h>

GameModel::GameModel()
{

}

void GameModel::startGame(GameType type)
{
    gameType = type;
    gameMapVec.clear();//棋盘的初始化
    for(int i=0;i<BOARD_GRAD_SIZE;i++)
    {
        std::vector<int> lineBoard;
        for(int j=0;j<BOARD_GRAD_SIZE;j++)//定义一个数组置0来填满二维数组
        {
            lineBoard.push_back(0);
        }
        gameMapVec.push_back(lineBoard);
    }

    playerFlag = true;//初始化为黑棋先落子
}

void GameModel::actionByPerson(int row, int col)//棋手下棋
{
    updateGameMap(row,col);
}
void GameModel::updateGameMap(int row, int col)//将棋手下的位置更新到棋盘
{
    if(playerFlag)
    {
        gameMapVec[row][col] = 1;//黑棋
    }else
    {
        gameMapVec[row][col] = -1;//白棋
    }
    //黑白轮换
    playerFlag = !playerFlag;
}

bool GameModel::isWin(int row,int col)// 判断胜负，水平竖直还有左斜右斜来进行判断是否有5子连珠获得胜利
{

    for(int i=0;i<5;i++)//判断水平方向是否有5子相連
    {
        if(row>0 && row<BOARD_GRAD_SIZE &&
           col-i>0 && col-i+4<BOARD_GRAD_SIZE &&
           gameMapVec[row][col-i] == gameMapVec[row][col-i+1] &&
           gameMapVec[row][col-i] == gameMapVec[row][col-i+2] &&
           gameMapVec[row][col-i] == gameMapVec[row][col-i+3] &&
           gameMapVec[row][col-i] == gameMapVec[row][col-i+4])
        {
            return true;
        }

        if(row-i>0 && row-i+4<BOARD_GRAD_SIZE &&
           col>0 && col<BOARD_GRAD_SIZE &&
           gameMapVec[row-i][col] == gameMapVec[row-i+1][col] &&
           gameMapVec[row-i][col] == gameMapVec[row-i+2][col] &&
           gameMapVec[row-i][col] == gameMapVec[row-i+3][col] &&
           gameMapVec[row-i][col] == gameMapVec[row-i+4][col])//判断垂直方向是否有5子相连
        {
            return true;
        }

        if(
           row-i>0 && row-i+4<BOARD_GRAD_SIZE &&
           col+i-4>0 && col+i<BOARD_GRAD_SIZE &&
           gameMapVec[row-i][col+i] == gameMapVec[row-i+1][col+i-1] &&
           gameMapVec[row-i][col+i] == gameMapVec[row-i+2][col+i-2] &&
           gameMapVec[row-i][col+i] == gameMapVec[row-i+3][col+i-3] &&
           gameMapVec[row-i][col+i] == gameMapVec[row-i+4][col+i-4]) //判断右斜是否有5子连珠，左下->右上
        {
            return true;
        }

        if(row-i>0 && row-i+4<BOARD_GRAD_SIZE &&
           col-i>0 && col-i+4<BOARD_GRAD_SIZE &&
           gameMapVec[row-i][col-i] == gameMapVec[row-i+1][col-i+1] &&
           gameMapVec[row-i][col-i] == gameMapVec[row-i+2][col-i+2] &&
           gameMapVec[row-i][col-i] == gameMapVec[row-i+3][col-i+3] &&
           gameMapVec[row-i][col-i] == gameMapVec[row-i+4][col-i+4]) //判断左斜方向是否有五子相恋，右下->左上
        {
            return true;
        }

    }
    return false;
}
